package com.bookcloud.java21.chapter8.线程间通讯88;

public class Message {
  private String message;
  private boolean empty = true;

  public synchronized String read() {
    // 循环检查条件，避免虚假唤醒
    while (empty) {
      try {
        System.out.println(Thread.currentThread().getName() + " 等待读取消息");
        // 等待写线程写入
        wait();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }

    empty = true;
    System.out.println(Thread.currentThread().getName() + " 读取消息: " + message);
    // 唤醒所有等待的线程（特别是写线程）
    notifyAll();
    return message;
  }

  public synchronized void write(String message) {
    // 循环检查条件，避免虚假唤醒
    while (!empty) {
      try {
        System.out.println(Thread.currentThread().getName() + " 等待写入消息");
        // 等待读线程读取
        wait();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }

    empty = false;
    this.message = message;
    System.out.println(Thread.currentThread().getName() + " 写入消息: " + message);
    // 唤醒所有等待的线程（特别是读线程）
    notifyAll(); // notify() 唤醒一个线程，notifyAll() 唤醒所有线程
  }
}
